/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Window;

import jplay.*;
import java.awt.DisplayMode;

import java.util.HashMap;
import java.util.Map;

import java.util.concurrent.TimeUnit;

import Controladores.ControladorJanela;
import Sueca.Carta;
import java.awt.Color;
import java.awt.Point;

/**
 *
 * @author Administrador
 */
public class Janela {

    Window w = new Window(800,600);

    Mouse mouse = w.getMouse();


    private static Janela instance;

    HashMap hash = new HashMap();

    HashMap ordem = new HashMap();

    HashMap mao = new HashMap();

    int cartasJogadasH[] = new int[10];
    int numCartas;
    int mapaCartas[] = new int[10];

    private Janela(){

    }
/*
    private HashMap getHash(){
        return hash;
    }

    public void setHash(HashMap map){
        this.hash =  map;
    }
*/
    public static Janela getInstance(){
        if(instance == null){
            instance = new Janela();
        }
        return instance;
    }

     //cria janela da aplicação
    public void iniciajanela(){

        
        //Seta o fundo da tela.
        GameImage backGround = new GameImage("image/feltro.jpg");
        backGround.draw();

        w.update();

/*
        Sprite ce00 = new Sprite("image/back-blue-150-3.png");
        ce00.x = 29;
        ce00.y = 184;

        hash.put(0, ce00);

        Sprite Caux;

        Caux = (Sprite) hash.get(0);
        Caux.draw();
*/
//        inicializaCartas();
//        inicializaOrdem();
//        distribuirCartas (Cartas);

//        w.update();

    }

    public void inicializaCartas(){




        //inicialização das imagens das cartas
        //ouro
        Sprite c00 = new Sprite("image/diamonds-2-150.png");
        Sprite c01 = new Sprite("image/diamonds-3-150.png");
        Sprite c02 = new Sprite("image/diamonds-4-150.png");
        Sprite c03 = new Sprite("image/diamonds-5-150.png");
        Sprite c04 = new Sprite("image/diamonds-6-150.png");
        Sprite c05 = new Sprite("image/diamonds-7-150.png");
        Sprite c06 = new Sprite("image/diamonds-j-150.png");
        Sprite c07 = new Sprite("image/diamonds-q-150.png");
        Sprite c08 = new Sprite("image/diamonds-k-150.png");
        Sprite c09 = new Sprite("image/diamonds-a-150.png");

        //paus
        Sprite c10 = new Sprite("image/clubs-2-150.png");
        Sprite c11 = new Sprite("image/clubs-3-150.png");
        Sprite c12 = new Sprite("image/clubs-4-150.png");
        Sprite c13 = new Sprite("image/clubs-5-150.png");
        Sprite c14 = new Sprite("image/clubs-6-150.png");
        Sprite c15 = new Sprite("image/clubs-7-150.png");
        Sprite c16 = new Sprite("image/clubs-j-150.png");
        Sprite c17 = new Sprite("image/clubs-q-150.png");
        Sprite c18 = new Sprite("image/clubs-k-150.png");
        Sprite c19 = new Sprite("image/clubs-a-150.png");

        //copas
        Sprite c20 = new Sprite("image/hearts-2-150.png");
        Sprite c21 = new Sprite("image/hearts-3-150.png");
        Sprite c22 = new Sprite("image/hearts-4-150.png");
        Sprite c23 = new Sprite("image/hearts-5-150.png");
        Sprite c24 = new Sprite("image/hearts-6-150.png");
        Sprite c25 = new Sprite("image/hearts-7-150.png");
        Sprite c26 = new Sprite("image/hearts-j-150.png");
        Sprite c27 = new Sprite("image/hearts-q-150.png");
        Sprite c28 = new Sprite("image/hearts-k-150.png");
        Sprite c29 = new Sprite("image/hearts-a-150.png");

        //espada
        Sprite c30 = new Sprite("image/spades-2-150.png");
        Sprite c31 = new Sprite("image/spades-3-150.png");
        Sprite c32 = new Sprite("image/spades-4-150.png");
        Sprite c33 = new Sprite("image/spades-5-150.png");
        Sprite c34 = new Sprite("image/spades-6-150.png");
        Sprite c35 = new Sprite("image/spades-7-150.png");
        Sprite c36 = new Sprite("image/spades-j-150.png");
        Sprite c37 = new Sprite("image/spades-q-150.png");
        Sprite c38 = new Sprite("image/spades-k-150.png");
        Sprite c39 = new Sprite("image/spades-a-150.png");

        //inicializando posição Y de todas as cartas
        //ouro
        c00.y = 494;
        c01.y = 494;
        c02.y = 494;
        c03.y = 494;
        c04.y = 494;
        c05.y = 494;
        c06.y = 494;
        c07.y = 494;
        c08.y = 494;
        c09.y = 494;

        //paus
        c10.y = 494;
        c11.y = 494;
        c12.y = 494;
        c13.y = 494;
        c14.y = 494;
        c15.y = 494;
        c16.y = 494;
        c17.y = 494;
        c18.y = 494;
        c19.y = 494;

        //copas
        c20.y = 494;
        c21.y = 494;
        c22.y = 494;
        c23.y = 494;
        c24.y = 494;
        c25.y = 494;
        c26.y = 494;
        c27.y = 494;
        c28.y = 494;
        c29.y = 494;

        //espada
        c30.y = 494;
        c31.y = 494;
        c32.y = 494;
        c33.y = 494;
        c34.y = 494;
        c35.y = 494;
        c36.y = 494;
        c37.y = 494;
        c38.y = 494;
        c39.y = 494;


        //coloca no mapa o sprite da carta e o seu id
        //ouro
        hash.put(0, c00);
        hash.put(1, c01);
        hash.put(2, c02);
        hash.put(3, c03);
        hash.put(4, c04);
        hash.put(5, c05);
        hash.put(6, c06);
        hash.put(7, c07);
        hash.put(8, c08);
        hash.put(9, c09);

        //paus
        hash.put(10, c10);
        hash.put(11, c11);
        hash.put(12, c12);
        hash.put(13, c13);
        hash.put(14, c14);
        hash.put(15, c15);
        hash.put(16, c16);
        hash.put(17, c17);
        hash.put(18, c18);
        hash.put(19, c19);

        //copas
        hash.put(20, c20);
        hash.put(21, c21);
        hash.put(22, c22);
        hash.put(23, c23);
        hash.put(24, c24);
        hash.put(25, c25);
        hash.put(26, c26);
        hash.put(27, c27);
        hash.put(28, c28);
        hash.put(29, c29);

        //espada
        hash.put(30, c30);
        hash.put(31, c31);
        hash.put(32, c32);
        hash.put(33, c33);
        hash.put(34, c34);
        hash.put(35, c35);
        hash.put(36, c36);
        hash.put(37, c37);
        hash.put(38, c38);
        hash.put(39, c39);

        //Inicializar "costas" das cartas
        //esquerda
        Sprite ce00 = new Sprite("image/back-blue-150-3.png");
        Sprite ce01 = new Sprite("image/back-blue-150-3.png");
        Sprite ce02 = new Sprite("image/back-blue-150-3.png");
        Sprite ce03 = new Sprite("image/back-blue-150-3.png");
        Sprite ce04 = new Sprite("image/back-blue-150-3.png");
        Sprite ce05 = new Sprite("image/back-blue-150-3.png");
        Sprite ce06 = new Sprite("image/back-blue-150-3.png");
        Sprite ce07 = new Sprite("image/back-blue-150-3.png");
        Sprite ce08 = new Sprite("image/back-blue-150-3.png");
        Sprite ce09 = new Sprite("image/back-blue-150-3.png");

        //direita
        Sprite cd00 = new Sprite("image/back-blue-150-3.png");
        Sprite cd01 = new Sprite("image/back-blue-150-3.png");
        Sprite cd02 = new Sprite("image/back-blue-150-3.png");
        Sprite cd03 = new Sprite("image/back-blue-150-3.png");
        Sprite cd04 = new Sprite("image/back-blue-150-3.png");
        Sprite cd05 = new Sprite("image/back-blue-150-3.png");
        Sprite cd06 = new Sprite("image/back-blue-150-3.png");
        Sprite cd07 = new Sprite("image/back-blue-150-3.png");
        Sprite cd08 = new Sprite("image/back-blue-150-3.png");
        Sprite cd09 = new Sprite("image/back-blue-150-3.png");

        //cima
        Sprite cc00 = new Sprite("image/back-blue-150-3.png");
        Sprite cc01 = new Sprite("image/back-blue-150-3.png");
        Sprite cc02 = new Sprite("image/back-blue-150-3.png");
        Sprite cc03 = new Sprite("image/back-blue-150-3.png");
        Sprite cc04 = new Sprite("image/back-blue-150-3.png");
        Sprite cc05 = new Sprite("image/back-blue-150-3.png");
        Sprite cc06 = new Sprite("image/back-blue-150-3.png");
        Sprite cc07 = new Sprite("image/back-blue-150-3.png");
        Sprite cc08 = new Sprite("image/back-blue-150-3.png");
        Sprite cc09 = new Sprite("image/back-blue-150-3.png");

        //inicialização da posição das cartas viradas
        //esquerda
        ce00.x = 29;
        ce01.x = 29;
        ce02.x = 29;
        ce03.x = 29;
        ce04.x = 29;
        ce05.x = 29;
        ce06.x = 29;
        ce07.x = 29;
        ce08.x = 29;
        ce09.x = 29;

        ce00.y = 184;
        ce01.y = 199;
        ce02.y = 214;
        ce03.y = 229;
        ce04.y = 244;
        ce05.y = 259;
        ce06.y = 274;
        ce07.y = 289;
        ce08.y = 304;
        ce09.y = 319;

        //direita
        cd00.x = 700;
        cd01.x = 700;
        cd02.x = 700;
        cd03.x = 700;
        cd04.x = 700;
        cd05.x = 700;
        cd06.x = 700;
        cd07.x = 700;
        cd08.x = 700;
        cd09.x = 700;

        cd00.y = 184;
        cd01.y = 199;
        cd02.y = 214;
        cd03.y = 229;
        cd04.y = 244;
        cd05.y = 259;
        cd06.y = 274;
        cd07.y = 289;
        cd08.y = 304;
        cd09.y = 319;

        //cima
        cc00.x = 297;
        cc01.x = 312;
        cc02.x = 327;
        cc03.x = 342;
        cc04.x = 357;
        cc05.x = 372;
        cc06.x = 387;
        cc07.x = 402;
        cc08.x = 417;
        cc09.x = 432;

        cc00.y = 10;
        cc01.y = 10;
        cc02.y = 10;
        cc03.y = 10;
        cc04.y = 10;
        cc05.y = 10;
        cc06.y = 10;
        cc07.y = 10;
        cc08.y = 10;
        cc09.y = 10;

        //mapeando
        hash.put(40, ce00);
        hash.put(41, ce01);
        hash.put(42, ce02);
        hash.put(43, ce03);
        hash.put(44, ce04);
        hash.put(45, ce05);
        hash.put(46, ce06);
        hash.put(47, ce07);
        hash.put(48, ce08);
        hash.put(49, ce09);

        hash.put(50, cd00);
        hash.put(51, cd01);
        hash.put(52, cd02);
        hash.put(53, cd03);
        hash.put(54, cd04);
        hash.put(55, cd05);
        hash.put(56, cd06);
        hash.put(57, cd07);
        hash.put(58, cd08);
        hash.put(59, cd09);

        hash.put(60, cc00);
        hash.put(61, cc01);
        hash.put(62, cc02);
        hash.put(63, cc03);
        hash.put(64, cc04);
        hash.put(65, cc05);
        hash.put(66, cc06);
        hash.put(67, cc07);
        hash.put(68, cc08);
        hash.put(69, cc09);
    }

    public void inicializaOrdem(){
        Integer pos00 = 297;
        Integer pos01 = 312;
        Integer pos02 = 327;
        Integer pos03 = 342;
        Integer pos04 = 357;
        Integer pos05 = 372;
        Integer pos06 = 387;
        Integer pos07 = 402;
        Integer pos08 = 417;
        Integer pos09 = 432;

        ordem.put(0, pos00);
        ordem.put(1, pos01);
        ordem.put(2, pos02);
        ordem.put(3, pos03);
        ordem.put(4, pos04);
        ordem.put(5, pos05);
        ordem.put(6, pos06);
        ordem.put(7, pos07);
        ordem.put(8, pos08);
        ordem.put(9, pos09);
    }

    public void iniciaMapaCartas(){
        //inicializa��o do mapa das cartas jogadas
        for(int i=0; i<10; i++){
            mapaCartas[i] = 0;
        }
    }

    public void reinicializaOrdem(int idCarta){

        Integer pos00 = 297;
        Integer pos01 = 312;
        Integer pos02 = 327;
        Integer pos03 = 342;
        Integer pos04 = 357;
        Integer pos05 = 372;
        Integer pos06 = 387;
        Integer pos07 = 402;
        Integer pos08 = 417;
        Integer pos09 = 432;

        ordem.put(0, pos00);
        ordem.put(1, pos01);
        ordem.put(2, pos02);
        ordem.put(3, pos03);
        ordem.put(4, pos04);
        ordem.put(5, pos05);
        ordem.put(6, pos06);
        ordem.put(7, pos07);
        ordem.put(8, pos08);
        ordem.put(9, pos09);
    }

    public void distribuirCartas (int[] maojogador, int idCarta){

            //Distribui��o de cartas da m�o do jogador */
            inicializaCartas();
            
            Sprite carta;
            Sprite cartaE;
            Sprite cartaD;
            Sprite cartaC;

            if (idCarta >= 0){
                cartasJogadasH[numCartas] = idCarta;
                numCartas++;
                for(int i = 0; i < numCartas; i++){
                    hash.remove(cartasJogadasH[i]);
                }

                hash.remove(39+numCartas);
                hash.remove(49+numCartas);
                hash.remove(59+numCartas);
            }


            int posicao = 297;

            for(int i = 0; i < 10; i++){
                if (hash.get(maojogador[i]) != null){
                    carta = (Sprite) hash.get(maojogador[i]);
                    carta.x = posicao;
                    carta.draw();
                    mao.put(i,carta);
                }
                posicao = posicao + 15;
            }

            for(int i = 40; i < (40+numCartas); i++){
                hash.remove(i);
            }

            for(int i = 40; i < 50; i++){
                if (hash.get(i) != null){
                    cartaE = (Sprite) hash.get(i);
                    cartaE.draw();
                }
            }

            for(int i = 50; i < (50+numCartas); i++){
                hash.remove(i);
            }

            for(int i = 50; i < 60; i++){
                if (hash.get(i) != null){
                    cartaD = (Sprite) hash.get(i);
                    cartaD.draw();
                }
            }

            for(int i = 60; i < (60+numCartas); i++){
                hash.remove(i);
            }

            for(int i = 60; i < 70; i++){
                if (hash.get(i) != null){
                    cartaC = (Sprite) hash.get(i);
                    cartaC.draw();
                }
            }

            //mostrarTrunfo(0);

            w.update();

            if( numCartas == 10 ){
                numCartas = 0;
            }

    }

    public int jogaCarta(int[] maoJogador){

        //Sprite carta;
        Point ponto;
        int x;
        int y;
        int novoX;

        while (true){
            //pinta cartas
            
            Keyboard keyboard = w.getKeyboard();
            if (keyboard.keyDown(Keyboard.ESCAPE_KEY))
                System.exit(0);

            try{
                if( mouse.isLeftButtonPressed() ){
                    ponto = mouse.getPosition();

                    x = ponto.x;
                    y = ponto.y;

                    if ((y >= 494)&&(y <= 590)){
                        if ((x > (Integer) ordem.get(0))&&(x < (Integer) ordem.get(1))&&(mapaCartas[0]==0)){
                            //mapaCartas[0] = 1;
                            return maoJogador[0];
                           
                        }else{
                            if ((x > (Integer) ordem.get(1))&&(x < (Integer) ordem.get(2))){
                               
                               if (mapaCartas[1] == 0){
                              //     mapaCartas[1] = 1;
                                   return maoJogador[1];
                               }else{
                                   if (mapaCartas[0] == 0){
                                //       mapaCartas[0] = 1;
                                       return maoJogador[0];
                                   }
                               }
                            }else{
                                if ((x > (Integer) ordem.get(2))&&(x < (Integer) ordem.get(3))){

                                    if (mapaCartas[2] == 0){
                                  //      mapaCartas[2] = 1;
                                        return maoJogador[2];                                        
                                    }else{
                                        if (mapaCartas[1] == 0){
                                    //        mapaCartas[1] = 1;
                                            return maoJogador[1];
                                        }else{
                                            if (mapaCartas[0] == 0){
                                      //          mapaCartas[0] = 1;
                                                return maoJogador[0];
                                            }
                                        }
                                    }

                                }else{
                                    if ((x > (Integer) ordem.get(3))&&(x < (Integer) ordem.get(4))){
                                        if (mapaCartas[3] == 0){
                                        //    mapaCartas[3] = 1;
                                            return maoJogador[3];
                                        }else{
                                            if (mapaCartas[2] == 0){
                                          //      mapaCartas[2] = 1;
                                                return maoJogador[2];
                                            }else{
                                                if (mapaCartas[1] == 0){
                                            //        mapaCartas[1] = 1;
                                                    return maoJogador[1];
                                                }
                                            }
                                        }
                                    }else{
                                        if ((x > (Integer) ordem.get(4))&&(x < (Integer) ordem.get(5))){
                                            if (mapaCartas[4] == 0){
                                              //  mapaCartas[4] = 1;
                                                return maoJogador[4];
                                            }else{
                                                if (mapaCartas[3] == 0){
                                                //    mapaCartas[3] = 1;
                                                    return maoJogador[3];
                                                }else{
                                                    if (mapaCartas[2] == 0){
                                                  //      mapaCartas[2] = 1;
                                                        return maoJogador[2];
                                                    }
                                                }
                                            }
                                        }else{
                                            if ((x > (Integer) ordem.get(5))&&(x < (Integer) ordem.get(6))){
                                                if (mapaCartas[5] == 0){
                                                    //mapaCartas[5] = 1;
                                                    return maoJogador[5];
                                                }else{
                                                    if (mapaCartas[4] == 0){
                                                    //    mapaCartas[4] = 1;
                                                        return maoJogador[4];
                                                    }else{
                                                        if (mapaCartas[3] == 0){
                                                      //      mapaCartas[3] = 1;
                                                            return maoJogador[3];
                                                        }
                                                    }
                                                }
                                            }else{
                                                if ((x > (Integer) ordem.get(6))&&(x < (Integer) ordem.get(7))){
                                                    if (mapaCartas[6] == 0){
                                             //           mapaCartas[6] = 1;
                                                        return maoJogador[6];
                                                    }else{
                                                        if (mapaCartas[5] == 0){
                                               //             mapaCartas[5] = 1;
                                                            return maoJogador[5];
                                                        }else{
                                                            if (mapaCartas[4] == 0){
                                                 //               mapaCartas[4] = 1;
                                                                return maoJogador[4];
                                                            }
                                                        }
                                                    }
                                                }else{
                                                    if ((x > (Integer) ordem.get(7))&&(x < (Integer) ordem.get(8))){
                                                        if (mapaCartas[7] == 0){
                                                   //         mapaCartas[7] = 1;
                                                            return maoJogador[7];
                                                        }else{
                                                            if (mapaCartas[6] == 0){
                                                     //           mapaCartas[6] = 1;
                                                                return maoJogador[6];
                                                            }else{
                                                                if (mapaCartas[5] == 0){
                                                       //             mapaCartas[5] = 1;
                                                                    return maoJogador[5];
                                                                }
                                                            }
                                                        }
                                                    }else{
                                                        if ((x > (Integer) ordem.get(8))&&(x < (Integer) ordem.get(9))){
                                                            if (mapaCartas[8] == 0){
                                                         //       mapaCartas[8] = 1;
                                                                return maoJogador[8];
                                                            }else{
                                                                if (mapaCartas[7] == 0){
                                                           //         mapaCartas[7] = 1;
                                                                    return maoJogador[7];
                                                                }else{
                                                                    if (mapaCartas[6] == 0){
                                                             //           mapaCartas[6] = 1;
                                                                        return maoJogador[6];
                                                                    }
                                                                }
                                                            }
                                                        }else{
                                                            if (mapaCartas[9] == 0){
                                                       //         mapaCartas[9] = 1;
                                                                return maoJogador[9];
                                                            }else{
                                                                if (mapaCartas[8] == 0){
                                                         //           mapaCartas[8] = 1;
                                                                    return maoJogador[8];
                                                                }else{
                                                                    if (mapaCartas[7] == 0){
                                                           //             mapaCartas[7] = 1;
                                                                        return maoJogador[7];
                                                                    }
                                                                }
                                                            }
                                                            
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }

                        }
                        //carta.x = 435;
                        //carta.y = 319;
                        //carta.draw();
                    }
                }
            w.update();
            //return 0;

            }catch(Exception e){
                System.out.println("Erro jogar cartas");
            }
        }
    }

    public void centralizaCarta (int idCarta, int jogador) throws InterruptedException{
        
        Sprite carta = (Sprite)hash.get(idCarta);
        
        try{
            if (jogador == 0){
                carta.x = 360;
                carta.y = 350;
                carta.draw();
            }else{
                if(jogador == 1){
                    carta.x = 460;
                    carta.y = 250;
                    carta.draw();
                }else{
                    if(jogador == 2){
                        carta.x = 360;
                        carta.y = 150;
                        carta.draw();
                        }else{
                            carta.x = 260;
                            carta.y = 250;
                            carta.draw();
                        }
                    }
                }
        }catch(Exception e){
            System.out.println("Erro no centraliza carta");
        }
        w.update();

        TimeUnit.SECONDS.sleep(1);
        
    }

    public void mostrarTrunfo(int id){

        Sprite trunfo = (Sprite) hash.get(id);
        if (trunfo != null){
            trunfo.x = 29;
            trunfo.y = 15;
            trunfo.draw();
        }
    
    }

    public void enviaMensagem(){
        w.drawText("Jogada inv�lida! Por favor, escolha outra carta.",297,484,Color.white);
        //w.drawText(null, numCartas, numCartas, Color.yellow, null);
    }


    public void setaMapaCarta(int idCarta, int[] maoJogador){
        
        for(int i = 0; i < 10; i++){
            if (idCarta == maoJogador[i]){
              mapaCartas[i] = 1;
              break;
            }
        }
    }


    public void dizVencedor(int dupla){
        if (dupla == 3){
            w.drawText("Empate",297,484,Color.white);
        }else{
            w.drawText("Dupla " + dupla +" venceu!",297,484,Color.white);
        }
    }


}
